﻿// Inner Fire 游戏引擎库
// Shader - 着色器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于载入着色器的配置信息
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-08

#pragma once

#include <game/resource/resource.h>
#include <string>
#include <xml_reader.h>

using namespace ikit;

namespace ifire::game {
class Assets;

struct ShaderDefine {
  ikit::sstr name;
  ikit::sstr value;

  ShaderDefine(const ikit::XmlNode& n);
};

class Shader : public Resource {
public:
  Shader(Assets* manager, const ikit::XmlNode& node);
  Shader(const Shader& lhs) = delete;
  Shader& operator=(const Shader& lhs) = delete;
  ~Shader() = default;

  // 获得用于编译的项目
  const D3D_SHADER_MACRO* GetD3DDefines();

  // 这个没有实际意义，只是为了匹配泛型
  void Ready() {}

public:
  std::string filename;
  std::string entry;
  std::string target;
  // 是否属于系统Shader，如果属于系统Shader，一开始的时候就编译，否则使用的时候才编译
  bool is_system;

private:
  // 定义的配置
  eastl::vector<ShaderDefine> defines_;
  // 存储转换后的D3D宏定义
  std::vector<D3D_SHADER_MACRO> d3dDefines_;
  // 标记是否已转换
  bool converted_;
};

using ShaderPtr = std::unique_ptr<Shader>;

} // namespace ifire::game